package com.anchovy.maven.service.impl;

import cn.dev33.satoken.stp.StpInterface;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * @description: 自定义权限接口
 * // 获取：当前账号所拥有的权限集合
 * StpUtil.getPermissionList();
 * // 判断：当前账号是否含有指定权限, 返回 true 或 false
 * StpUtil.hasPermission("user.add");
 * // 校验：当前账号是否含有指定权限, 如果验证未通过，则抛出异常: NotPermissionException
 * StpUtil.checkPermission("user.add");
 * // 校验：当前账号是否含有指定权限 [指定多个，必须全部验证通过]
 * StpUtil.checkPermissionAnd("user.add", "user.delete", "user.get");
 * // 校验：当前账号是否含有指定权限 [指定多个，只要其一验证通过即可]
 * StpUtil.checkPermissionOr("user.add", "user.delete", "user.get");
 * <p>
 * // 获取：当前账号所拥有的角色集合
 * StpUtil.getRoleList();
 * // 判断：当前账号是否拥有指定角色, 返回 true 或 false
 * StpUtil.hasRole("super-admin");
 * // 校验：当前账号是否含有指定角色标识, 如果验证未通过，则抛出异常: NotRoleException
 * StpUtil.checkRole("super-admin");
 * // 校验：当前账号是否含有指定角色标识 [指定多个，必须全部验证通过]
 * StpUtil.checkRoleAnd("super-admin", "shop-admin");
 * // 校验：当前账号是否含有指定角色标识 [指定多个，只要其一验证通过即可]
 * StpUtil.checkRoleOr("super-admin", "shop-admin");
 * <p>
 * 权限通配符
 * // 当拥有 art.* 权限时
 * StpUtil.hasPermission("art.add");        // true
 * StpUtil.hasPermission("art.update");     // true
 * StpUtil.hasPermission("goods.add");      // false
 * // 当拥有 *.delete 权限时
 * StpUtil.hasPermission("art.delete");      // true
 * StpUtil.hasPermission("user.delete");     // true
 * StpUtil.hasPermission("user.update");     // false
 * <p>
 * // 当拥有 *.js 权限时
 * StpUtil.hasPermission("index.js");        // true
 * StpUtil.hasPermission("index.css");       // false
 * StpUtil.hasPermission("index.html");      // false
 * 上帝权限：当一个账号拥有 "*" 权限时，他可以验证通过任何权限码 （角色认证同理）
 */
@Component
@Slf4j
public class StpInterfaceImpl implements StpInterface {

    /**
     * 返回一个账号所拥有的权限码集合
     */
    @Override
    public List<String> getPermissionList(Object o, String s) {
        log.info("getPermissionList={},{}", o, s);
        // 本 list 仅做模拟，实际项目中要根据具体业务逻辑来查询权限
        List<String> list = new ArrayList<String>();
        list.add("101");
        list.add("user.add");
        list.add("user.update");
        list.add("user.get");
        // list.add("user.delete");
        list.add("art.*");
        return list;
    }

    /**
     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
     */
    @Override
    public List<String> getRoleList(Object o, String s) {
        log.info("getRoleList={},{}", o, s);
        // 本 list 仅做模拟，实际项目中要根据具体业务逻辑来查询角色
        List<String> list = new ArrayList<String>();
        list.add("admin");
        list.add("super-admin");
        return list;
    }


}
